Debugging multi-threaded applications can be a challenging task. The increased complexity of multithreaded programs can result in a large number of possible states that the program may be in at any given time. Determining the state of the program at the time of a failure can be difficult. Understanding why a particular state is troublesome can be even more difficult. Multithreaded programs often fail in unexpected ways, and often in a nondeterministic fashion. Failures or errors may manifest themselves inconsistently and sporadically leading to frustration by the software developers who may be accustomed to troubleshooting programming issues that are consistently reproducible and predictable. Furthermore, multithreaded programs and applications can fail in a drastic fashion. Deadlocks cause an application to hang or freeze and even the entire system to hang as well. Bugs resulting in failures and freezes are generally unacceptable to users and are expected to be fixed prior to a program's release or within a timely manner after discovering the presence of a sequencing errors in a multithreaded program or application.